home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 7 / FM Towns Free Software Collection 7.iso / t_os / fb386lnc / fb386lnc.bas next >
BASIC Source File  |  1993-11-30  |  8KB  |  299 lines

  1. 10 '***************************************
  2. 20 '* BASLNCNV.BAS    Copyright A.Okuyama *
  3. 30 '*  BASIC Line Number Convert Program  *
  4. 40 '* 1993, 5,17     Ver. 1.00 1993, 5,17 *
  5. 50 '***************************************
  6. 60 '
  7. 70 '
  8. 80 '
  9. 90 '==============================
  10. 100 *SETUP
  11. 110 COLOR 7
  12. 120 CLEAR 
  13. 130 '***** 編集可能ソースファイルサイズ *****
  14. 140          MAXPTR&=300000  '(Bytes)
  15. 150 '****************************************
  16. 160 DIM WORD%(INT(MAXPTR&/2)),CMD$(17),O_FILE$(3)
  17. 170 DIM L2G(65528),LABEL%(65528)
  18. 180 O_FILE$(0)="SCRN:"
  19. 190 EOPROC%=0
  20. 200 SPTAB%=4
  21. 210 FOR C%=0 TO 17
  22. 220 READ CMD$(C%)
  23. 230 NEXT C%
  24. 240 DATA "CHAIN"  ,  "DELETE",  "ELSE"  ,  "THEN",  "GOSUB",  "GOS."
  25. 250 DATA "GOTO"   ,  "GO."   ,  "LIST"  ,  "L."  ,  "LLIST",  "RENUM"
  26. 260 DATA "RESTORE",  "RESUME",  "RETURN",  "RET.",  "RUN"  ,  "R."
  27. 270 '==============================
  28. 280 *START
  29. 290  'CLS:PRINT FRE(1);FRE(3);FRE(4):END:CLS
  30. 300  PRINT "============================================================="
  31. 310  PRINT "FB386 Line Number Convert Program .  Copyright A.Okuyama 1993"
  32. 320  PRINT "============================================================="
  33. 330  LINE INPUT "Input  File Name. :",I_FILE$
  34. 340  LINE INPUT "Output File Name. :",O_FILE$(1)
  35. 350  PRINT "============================================================="
  36. 360  IF I_FILE$="" OR O_FILE$(1)="" THEN *START
  37. 370  IF I_FILE$   ="E" OR I_FILE$   ="e" THEN END
  38. 380  IF I_FILE$   ="Q" OR I_FILE$   ="q" THEN END
  39. 390  IF O_FILE$(1)="E" OR O_FILE$(1)="e" THEN END
  40. 400  IF O_FILE$(1)="Q" OR O_FILE$(1)="q" THEN END
  41. 410  IF I_FILE$=O_FILE$(1) THEN *START
  42. 420  IF 0<INSTR(O_FILE$(1),".") THEN
  43. 430    O_FILE$(3)=LEFT$(O_FILE$(1),INSTR(O_FILE$(1),"."))
  44. 440  ELSE
  45. 450    O_FILE$(3)=O_FILE$(1)+"."
  46. 460  ENDIF
  47. 470  O_FILE$(1)=O_FILE$(3)+"NOL"  'NO Line number
  48. 480  O_FILE$(2)=O_FILE$(3)+"LON"  'Line number ON
  49. 490  O_FILE$(3)=O_FILE$(3)+"LOL"  'Llst Of Label
  50. 500  LOAD@ I_FILE$,WORD%
  51. 510  FOR SET%=1 TO 2
  52. 520    GOSUB *NEWPROC
  53. 530 *CKPROC
  54. 540    GOSUB *GETBYTE
  55. 550    GOSUB *WORD_CUT
  56. 560    IF EOPROC%<>SET% THEN *CKPROC
  57. 570  NEXT SET%
  58. 580  CLOSE #2
  59. 590  COLOR 6
  60. 600  OPEN O_FILE$(1) FOR INPUT AS #3
  61. 610  OPEN O_FILE$(2) FOR OUTPUT AS #2
  62. 620  GOSUB *LINE_ON
  63. 630  CLOSE #2,#3
  64. 640  OPEN O_FILE$(3) FOR OUTPUT AS #2
  65. 650  COLOR 7
  66. 660  GOSUB *LABELIST
  67. 670 *EOPROG
  68. 680  CLOSE
  69. 690  SYSTEM
  70. 700 '==============================
  71. 710 *NEWPROC
  72. 720  PTR&=0       'ファイル内BYTEポインター
  73. 730  LNO&=0       '行番号テーブル用論理行番号
  74. 740  COLUM=0      '行内BYTE位置
  75. 750  LABEL%=0     'ラベル作成指標
  76. 760  GYOU%=1      '行先頭の行番号判定
  77. 770  WORD$=""     'スペース区切りの単語文字列
  78. 780  MBYTE$=" "   'ファイルエンド判定
  79. 790  COMMENT%=0   '"ダブルコーテーションマーク内外判定"
  80. 800  MESSEGE%=0   'REM文内外判定
  81. 810  OPEN O_FILE$(SET%-1) FOR OUTPUT AS #SET%
  82. 820  COLOR 3+SET%
  83. 830 RETURN
  84. 840 '==============================
  85. 850 *GETBYTE
  86. 860  IF MAXPTR&<PTR& THEN *EOPROC
  87. 870  WORD&=WORD%(INT(PTR&/2))-(WORD%(INT(PTR&/2))<0)*&H10000
  88. 880  IF PTR&=INT(PTR&/2)*2 THEN
  89. 890  '~~~~~~~~~~~~ WORD%()の下位バイト
  90. 900    BYTE$=CHR$(WORD&-INT(WORD&/&H100)*&H100)
  91. 910  ELSE
  92. 920  '~~~~~~~~~~~~ WORD%()の上位バイト
  93. 930    BYTE$=CHR$(INT(WORD&/&H100))
  94. 940  ENDIF
  95. 950  IF BYTE$=CHR$(0) AND MBYTE$=CHR$(0) THEN *EOPROC
  96. 960  MBYTE$=BYTE$
  97. 970 RETURN
  98. 980 '==============================
  99. 990 *POUT
  100. 1000  FOR C%=1 TO SET%
  101. 1010    PRINT #C%,BYTE$;
  102. 1020  NEXT C%
  103. 1030 RETURN
  104. 1040 '==============================
  105. 1050 *WORD_CUT
  106. 1060  '~~~~~~~~~~~~ 2バイト文字
  107. 1070  IF (&H7F<ASC(BYTE$) AND ASC(BYTE$)<&HA0) OR &HDF<ASC(BYTE$) THEN
  108. 1080    IF BYTE$=CHR$(&H81) THEN
  109. 1090      PTR&=PTR&+1
  110. 1100      GOSUB *GETBYTE
  111. 1110      IF BYTE$=CHR$(&H40) AND COMMENT%=0 AND MESSEGE%=0 THEN
  112. 1120        GOSUB *WORD_CK
  113. 1130        BYTE$=" "
  114. 1140        IF SET%=1 OR GYOU%=0 THEN GOSUB *POUT
  115. 1150        GYOU%=0
  116. 1160        GOSUB *POUT
  117. 1170      ELSE
  118. 1180        WORD$=WORD$+CHR$(&H81)+BYTE$
  119. 1190        GYOU%=0
  120. 1200      ENDIF
  121. 1210      COLUM=COLUM+2
  122. 1220      PTR&=PTR&+1
  123. 1230      RETURN
  124. 1240    ENDIF
  125. 1250    GYOU%=0
  126. 1260    WORD$=WORD$+BYTE$
  127. 1270    PTR&=PTR&+1
  128. 1280    GOSUB *GETBYTE
  129. 1290    WORD$=WORD$+BYTE$
  130. 1300    COLUM=COLUM+2
  131. 1310    PTR&=PTR&+1
  132. 1320    RETURN
  133. 1330  ENDIF
  134. 1340  '~~~~~~~~~~~~ (0)"(1)コメント"(0)
  135. 1350  IF BYTE$=CHR$(&H22) AND MESSEGE%=0 THEN
  136. 1360    COMMENT%=ABS(COMMENT%-1)
  137. 1370  ENDIF
  138. 1380  '~~~~~~~~~~~~ (0)'(1)メッセージ
  139. 1390  IF BYTE$=CHR$(&H27) AND COMMENT%=0 THEN
  140. 1400    MESSEGE%=1
  141. 1410  ENDIF
  142. 1420  IF COMMENT%=0 AND MESSEGE%=0 THEN
  143. 1430  '~~~~~~~~~~~~ 半角スペース
  144. 1440    IF BYTE$=" " THEN
  145. 1450      GOSUB *WORD_CK
  146. 1460      COLUM=COLUM+1
  147. 1470      PTR&=PTR&+1
  148. 1480      IF SET%=1 OR GYOU%=0 THEN GOSUB *POUT
  149. 1490      GYOU%=0
  150. 1500      RETURN
  151. 1510    ENDIF
  152. 1520  '~~~~~~~~~~~~ コマンドライン区切り文字
  153. 1530    IF BYTE$=":" THEN
  154. 1540      GOSUB *WORD_CK
  155. 1550      COLUM=COLUM+1
  156. 1560      PTR&=PTR&+1
  157. 1570      GYOU%=0
  158. 1580      LABEL%=0
  159. 1590      GOSUB *POUT
  160. 1600      RETURN
  161. 1610    ENDIF
  162. 1620  '~~~~~~~~~~~~ コマンド区切り文字
  163. 1630    IF BYTE$="," OR BYTE$="-" THEN
  164. 1640      GOSUB *WORD_CK
  165. 1650      COLUM=COLUM+1
  166. 1660      PTR&=PTR&+1
  167. 1670      GYOU%=0
  168. 1680      GOSUB *POUT
  169. 1690      RETURN
  170. 1700    ENDIF
  171. 1710  ENDIF
  172. 1720  '~~~~~~~~~~~~ TAB
  173. 1730  IF BYTE$=CHR$(9) THEN
  174. 1740    GOSUB *WORD_CK
  175. 1750    IF SET%=1 OR GYOU%=0 THEN
  176. 1760      BYTE$=SPACE$(SPTAB%-(COLUM MOD SPTAB%))
  177. 1770    ELSE
  178. 1780      BYTE$=SPACE$(SPTAB%-(COLUM MOD SPTAB%)-1)
  179. 1790    ENDIF
  180. 1800    COLUM=COLUM+(SPTAB%-(COLUM MOD SPTAB%))
  181. 1810    PTR&=PTR&+1
  182. 1820    GYOU%=0
  183. 1830    GOSUB *POUT
  184. 1840    RETURN
  185. 1850  ENDIF
  186. 1860  '~~~~~~~~~~~~ CR
  187. 1870  IF BYTE$=CHR$(13) THEN
  188. 1880    GOSUB *WORD_CK
  189. 1890    COMMENT%=0
  190. 1900    MESSEGE%=0
  191. 1910    COLUM=0
  192. 1920    PTR&=PTR&+1
  193. 1930    LNO&=LNO&+1
  194. 1940    GYOU%=1
  195. 1950    LABEL%=0
  196. 1960    GOSUB *POUT
  197. 1970    RETURN
  198. 1980  ENDIF
  199. 1990 '~~~~~~~~~~~~ LF
  200. 2000  IF BYTE$=CHR$(10) THEN
  201. 2010    PTR&=PTR&+1
  202. 2020    GOSUB *POUT
  203. 2030    RETURN
  204. 2040  ENDIF
  205. 2050  '~~~~~~~~~~~~ 1バイト文字
  206. 2060  WORD$=WORD$+BYTE$
  207. 2070  COLUM=COLUM+1
  208. 2080  PTR&=PTR&+1
  209. 2090  IF BYTE$<"0" OR "9"<BYTE$ THEN
  210. 2100    GYOU%=0
  211. 2110  ENDIF
  212. 2120 RETURN
  213. 2130 '==============================
  214. 2140 *WORD_CK
  215. 2150  IF WORD$="" THEN
  216. 2160    GYOU%=0
  217. 2170    RETURN
  218. 2180  ENDIF
  219. 2190  IF COMMENT%=0 AND (WORD$="REM" OR LEFT$(WORD$,1)="'") THEN
  220. 2200    MESSEGE%=1
  221. 2210  ENDIF
  222. 2220  IF COMMENT%=1 OR MESSEGE%=1 THEN *WCK_PASS
  223. 2230  IF GYOU%=1 THEN
  224. 2240    IF SET%=1 THEN
  225. 2250      GOSUB *GYOU
  226. 2260    ELSE
  227. 2270      IF LABEL%(L2G(LNO&))=1 THEN
  228. 2280        WORD$="*L"+RIGHT$(STR$(100000+L2G(LNO&)),5)+CHR$(13)+CHR$(10)
  229. 2290        COLOR 7
  230. 2300        GOTO *WCK_PASS
  231. 2310      ELSE
  232. 2320        WORD$=""
  233. 2330        RETURN
  234. 2340      ENDIF
  235. 2350    ENDIF
  236. 2360  ENDIF
  237. 2370  CKWORD%=0
  238. 2380  FOR C=0 TO 17
  239. 2390    IF WORD$=CMD$(C) THEN
  240. 2400      LABEL%=1
  241. 2410      CKWORD%=1
  242. 2420    ELSE
  243. 2430       IF LEFT$(WORD$,1)<>"*" AND VAL(WORD$)=0 AND CKWORD%=0 THEN
  244. 2440         LABEL%=0
  245. 2450      ENDIF
  246. 2460    ENDIF
  247. 2470  NEXT C
  248. 2480  IF VAL(WORD$)<>0 THEN
  249. 2490    IF LABEL%=1 THEN
  250. 2500      IF SET%=1 THEN
  251. 2510        LABEL%(VAL(WORD$))=1
  252. 2520      ELSE
  253. 2530        WORD$="*L"+RIGHT$("00000"+WORD$,5)
  254. 2540        COLOR 7
  255. 2550      ENDIF
  256. 2560    ENDIF
  257. 2570  ENDIF
  258. 2580 *WCK_PASS
  259. 2590  FOR C%=1 TO SET%
  260. 2600    PRINT #C%,WORD$;
  261. 2610  NEXT C%
  262. 2620  WORD$=""
  263. 2630  COLOR 3+SET%
  264. 2640 RETURN
  265. 2650 '==============================
  266. 2660 *GYOU:' 行番号取得
  267. 2670  IF GYOU%=1 THEN
  268. 2680    L2G(LNO&)=VAL(WORD$)
  269. 2690  ENDIF
  270. 2700 RETURN
  271. 2710 '==============================
  272. 2720 *EOPROC
  273. 2730  EOPROC%=SET%
  274. 2740 RETURN
  275. 2750 '==============================
  276. 2760 *LINE_ON
  277. 2770  GYOU=1
  278. 2780 *NEW_LINE
  279. 2790  IF EOF(3) THEN RETURN
  280. 2800  LNO$=MID$(STR$(GYOU),2,5)+" "
  281. 2810  LINE INPUT #3,COMMAND$
  282. 2820  FOR C%=1 TO 2
  283. 2830    PRINT #C%,LNO$;COMMAND$
  284. 2840  NEXT C%
  285. 2850  GYOU=GYOU+1
  286. 2860  GOTO *NEW_LINE
  287. 2870 '==============================
  288. 2880 *LABELIST
  289. 2890  LNOMAX&=LNO&-1
  290. 2900  FOR LNO&=0 TO LNOMAX&
  291. 2910    IF LABEL%(L2G(LNO&))=1 THEN
  292. 2920      LOL$="*L"+RIGHT$(STR$(100000+L2G(LNO&)),5)
  293. 2930      FOR SET%=1 TO 2
  294. 2940        PRINT #SET%,LOL$
  295. 2950      NEXT SET%
  296. 2960    ENDIF
  297. 2970  NEXT LNO&
  298. 2980 RETURN
  299.